# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/11/23 16:36'

"""
    Python中的一场处理try-except
    1- 多个异常python可以写在同一行，括号包括多个异常，逗号隔开
    2- 获取异常的信息描述通过 as e的方式
    3- 发生异常执行except，不发生异常执行else，两者对立
"""
try:
	file = open("Test.txt", "r")
except (FileNotFoundError, NameError) as e:
	print("捕获到了异常，异常信息%s, 准备补救工作..." % e)
# file = open("Test.txt", "w")
except Exception as e:
	print("捕获到了超级异常")
else:
	print("如果try中的代码不发生异常执行else")
finally:
	print("Finally有没有异常都会执行的")

print('------------------------------------')

"""
    异常嵌套中的传递， 内部的异常搞不定就会传到外边一层去处理
"""
try:
	try:
		file = open("Test.txt", "r")
	finally:
		print("这里没有处理内部的异常")
except:
	print("外部一层捕获到了内部的异常")

print('------------------------------------')

"""
    函数中异常的传递,内部的异常向外传递
"""


def fun1():
	print(10 / 0)


def fun2():
	fun1()


def fun3():
	try:
		fun2()
	except:
		print("在最外层的函数中捕获到了异常")


fun3()
print('------------------------------------')

"""
    抛出自定义的异常,需要继承Exception, str方法显示的是信息的描述
    1- raise AgeError(age) 关键字进行自定义对象的抛出
    2- raise关键字的两个作用a:抛出自定义异常 b:将本异常不处理，进行抛出
"""


class AgeError(Exception):

	# 使用init的方法主要是要age的值， 此方法非必需
	def __init__(self, age):
		self.age = age

	def __str__(self):
		return "你输入的年龄有误：age=%d" % self.age


class Person(object):

	def __init__(self, name, age):
		self.name = name
		if age <= 0 or age >= 150:
			raise AgeError(age)
		else:
			self.age = age


p1 = Person("小明", 223)

print('------------------------------------')

"""
    异常处理中的**不处理，抛出异常给下一层**
"""


class Test(object):

	def __init__(self, switch):
		self.switch = switch

	def calculate(self, a, b):
		try:
			return a / b
		except Exception as e:
			if self.switch:
				print("设置为自动捕获异常，异常如下：%s" % e)
			else:
				raise


Test(False).calculate(8, 0)
